package com.sen.common.utils;

import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.collections.Transformer;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 字符串的trim操作, 适合于对字符串, javabean, list和map等的字符串进行trim操作. <br>
 * <b>注意: </b>不要传入null对象.
 * 
 * @author sen
 */
public final class Trimmer {
	
	private static final Logger LOG = LoggerFactory.getLogger(Trimmer.class);
	
	private Trimmer() {
		// empty!
	}

	/**
	 * 去除字符串两边的空格. <br>
	 * 该方法并不改变参数的值, 将返回操作后的结果字符串.
	 * 
	 * @param str
	 *            需要去除两边空格的字符串
	 * @return 两边空格去除后的结果字符串
	 */
	public static String trim(String str) {
		return StringUtils.stripToEmpty(str);
	}

	/**
	 * 去除字符串数组里面的所有字符串两边的空格. <br>
	 * 将改变字符串数组的值.
	 * 
	 * @param strs
	 *            需要去除两边空格的字符串数组
	 * @return 去除空格后的数组
	 */
	public static String[] trim(String[] strs) {
		if (ArrayUtils.isEmpty(strs)) {
			return strs;
		}
		for (int i = 0, len = strs.length; i < len; i++) {
			strs[i] = trim(strs[i]);
		}
		return strs;
	}

	/**
	 * 去除字符串集合里面的所有字符串两边的空格. <br>
	 * 将改变字符串集合的值.
	 * 
	 * @param strs
	 *            需要去除两边空格的字符串集合
	 * @return 去除空格后的集合
	 */
	public static Collection<String> trim(Collection<String> strs) {
		if (CollectionUtils.isEmpty(strs)) {
			return strs;
		}
		CollectionUtils.transform(strs, new Transformer() {
			public Object transform(Object obj) {
				return trim((String) obj);
			}
		});
		return strs;
	}

	/**
	 * 去除普通javabean里的字符串属性值的两边的空格.
	 * 
	 * @param obj
	 *            普通javabean
	 * @return 去除空格后的对象
	 */
	public static Object trim(Object obj) {
		if (null == obj) {
			return obj;
		}
		Field[] fields = obj.getClass().getDeclaredFields();
		if (ArrayUtils.isEmpty(fields)) {
			return obj;
		}
		for (Field field : fields) {
			try {
				field.setAccessible(true);
				Object value = field.get(obj);
				if (isNotStringClass(value)) {
					continue;
				}
				field.set(obj, trim(value.toString()));
			} catch (IllegalArgumentException e) {
				LOG.warn("timmer转化错误", e);
			} catch (IllegalAccessException e) {
				LOG.warn("timmer转化错误", e);
			}
		}
		return obj;
	}

	/**
	 * 去除Map里的字符串属性值的两边的空格.
	 * 
	 * @param map
	 *            普通<code>Map</code>对象
	 * @return 去除空格后的map
	 */
	@SuppressWarnings("unchecked")
	public static Map trim(Map map) {
		if (MapUtils.isEmpty(map)) {
			return map;
		}
		Set keys = map.keySet();
		if (CollectionUtils.isEmpty(keys)) {
			return map;
		}
		for (Object key : keys) {
			Object value = map.get(key);
			if (isNotStringClass(value)) {
				continue;
			}
			map.put(key, trim(value.toString()));
		}
		return map;
	}

	private static boolean isNotStringClass(Object value) {
		return null == value || value.getClass() != String.class;
	}
}
